package baiwa.rta.dao.Impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import baiwa.rta.dao.FunctionRoomUsageDao;
import baiwa.rta.model.DataTableModel;
import baiwa.rta.model.RMfrudtlModel;
import baiwa.rta.model.RMfruhdrModel;
import baiwa.rta.utils.DateUtils;

@Repository("functionRoomUsageDao")
public class FunctionRoomUsageDaoImpl implements FunctionRoomUsageDao {

	private static final Logger logger = Logger.getLogger( FunctionRoomUsageDaoImpl.class );

	
	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Override
	public List<RMfruhdrModel> findAll() {
		return null;
	}

	@Override
	public RMfruhdrModel findById(Integer id) {
		String sql = "SELECT a.*,b.* FROM rmfruhdr a, rmfrudtl b WHERE a.FRUHID=b.FRUHID AND a.FRUHID=" + id;
		
		RMfruhdrModel r = jdbcTemplate.queryForObject(sql, new JoinHDLHDR());
		
		return r;
	}

	@Override
	@Transactional
	public void create(RMfruhdrModel model) throws Exception {

		String sql = "insert into `rmfruhdr`" +
				"(`FRUHID`,`RLRMID`,`FRUHSDAT`,`FRUHEDAT`,`FRUHSTIME`,`FRUHEDTIME`,`FRUHCREBY`,`FRUHCREDAT`,`FRUHUPDBY`,`FRUHUPDDAT`) " +
				"values" +
				" ( NULL,NULL, ? , ? , ? , ? , ? , ? , ? , ? )";
		
		jdbcTemplate.update(sql, DateUtils.getDateFormate( model.getFruhsdat()),  DateUtils.getDateFormate(model.getFruhedat()),
				model.getFruhstime(),model.getFruhedtime(), model.getFruhcreby(),model.getFruhcredat(),model.getFruhupdby(),model.getFruhupddat());
		RMfrudtlModel dtl = model.getrMfrudtlModel();
		
		int rowId = jdbcTemplate.queryForInt("SELECT  LAST_INSERT_ID() ");
		
		String sqlhdl = "insert into `rmfrudtl`(" +
				"`FRUDID`," +
				"`FRUHID`,`FRUDREQBY`,`FRUDREQDAT`,`FRUDPRU`,`FRUDRMTYP`,`FRUDDTL`,`FRUDAPS`,`FRUDAPSPRC`,`FRUDTBAMT`," +
				"`FRUDTBPRC`,`FRUDCHRAMT`,`FRUDCHRPRC`,`FRUDBR`,`FRUDTOTALCST`,`FRUDPAYSTAT`,`FRUDREMARK`,`FRUDREQBY2`," +
				"`FRUDREQDAT2`,`FRUDAUTBY`," +
				"`FRUDAUTDAT`,`FRUDCREBY`,`FRUDCREDAT`,`FRUUPDBY`,`FRUDUPDDAT`,`FRUDBRAMT`," +
				"`FRUDCHR`,`FRUDTB`,`FRUDBRPRC`" +
				") values (" +
				" NULL, ? , ? ,? , ? , ? , ? ,  ? , ? , ? , ? ," +
				" ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ," +
				" ? , ? , ? , ? , ? , ? , ? , ? )";
		
		dtl.setFruhidKey(rowId);
		
		logger.info("rmfruhdr " + rowId );
		jdbcTemplate.update(sqlhdl,
				dtl.getFruhidKey(),
				dtl.getFrudreqby(), DateUtils.getDateFormate( dtl.getFrudreqdat()) ,dtl.getFrudpru(),dtl.getFrudrmtyp(),dtl.getFruddtl(),(dtl.getFrudaps().equalsIgnoreCase("true")?"Y" : "N"),dtl.getFrudapsprc(),dtl.getFrudtbamt(),
				dtl.getFrudtbprc(),dtl.getFrudchramt(),dtl.getFrudchrprc(),(dtl.getFrudbr().equalsIgnoreCase("true")?"Y" : "N"),dtl.getFrudtotalcst(),dtl.getFrudpaystat(),dtl.getFrudremark(),dtl.getFrudreqby2(),
				DateUtils.getDateFormate(dtl.getFrudreqdat2()),dtl.getFrudautby(),
				DateUtils.getDateFormate(dtl.getFrudautdat()),dtl.getFrudcreby(),dtl.getFrudcredat() ,dtl.getFruupdby(),dtl.getFrudupddat(),dtl.getFrudbramt() ,
				(dtl.getFrudchr().equalsIgnoreCase("true")?"Y" : "N"),(dtl.getFrudtb().equalsIgnoreCase("true")?"Y" : "N"),dtl.getFrudbrprc());
		
	}

	@Override
	public boolean update(RMfruhdrModel model) {
		
		logger.info("####update" + model.getFruhid());
		
		String sql="update `rmfruhdr` set `FRUHID`=? ,`RLRMID`=NULL ,`FRUHSDAT`=? ,`FRUHEDAT`=? ,`FRUHSTIME`=? ,`FRUHEDTIME`=? ,`FRUHCREBY`=? ,`FRUHCREDAT`=? ,`FRUHUPDBY`=? ,`FRUHUPDDAT`=?  where `FRUHID`=? ";
		jdbcTemplate.update(sql,model.getFruhid(), DateUtils.getDateFormate( model.getFruhsdat()),  DateUtils.getDateFormate(model.getFruhedat()),
				model.getFruhstime(),model.getFruhedtime(), model.getFruhcreby(),model.getFruhcredat(),model.getFruhupdby(),model.getFruhupddat(),model.getFruhid());
		
	
		RMfrudtlModel dtl = model.getrMfrudtlModel();
		String sql2 = "update `rmfrudtl` set" +
				" `FRUDID`=? ,`FRUHID`=?,`FRUDREQBY`=? ,`FRUDREQDAT`=? ," +
				"`FRUDPRU`=? ,`FRUDRMTYP`=? ,`FRUDDTL`=? ,`FRUDAPS`=? ,`FRUDAPSPRC`=? ,`FRUDTBAMT`=? ," +
				"`FRUDTBPRC`=? ,`FRUDCHRAMT`=? ,`FRUDCHRPRC`=? ,`FRUDBR`=? ,`FRUDTOTALCST`=? ," +
				"`FRUDPAYSTAT`=? ,`FRUDREMARK`=? ,`FRUDREQBY2`=? ,`FRUDREQDAT2`=? ,`FRUDAUTBY`=? ," +
				"`FRUDAUTDAT`=? ,`FRUDCREBY`=? ,`FRUDCREDAT`=? ,`FRUUPDBY`=? ,`FRUDUPDDAT`=? ," +
				"`FRUDBRAMT`=? ,`FRUDCHR`=? ,`FRUDTB`=? ,`FRUDBRPRC`=?  where `FRUDID`=? ";

		jdbcTemplate.update(sql2,
				dtl.getFrudid(),
				dtl.getFruhidKey(),
				dtl.getFrudreqby(), DateUtils.getDateFormate( dtl.getFrudreqdat()) ,dtl.getFrudpru(),dtl.getFrudrmtyp(),dtl.getFruddtl(),(dtl.getFrudaps().equalsIgnoreCase("true")?"Y" : "N"),dtl.getFrudapsprc(),dtl.getFrudtbamt(),
				dtl.getFrudtbprc(),dtl.getFrudchramt(),dtl.getFrudchrprc(),(dtl.getFrudbr().equalsIgnoreCase("true")?"Y" : "N"),dtl.getFrudtotalcst(),dtl.getFrudpaystat(),dtl.getFrudremark(),dtl.getFrudreqby2(),
				DateUtils.getDateFormate(dtl.getFrudreqdat2()),dtl.getFrudautby(),
				DateUtils.getDateFormate(dtl.getFrudautdat()),dtl.getFrudcreby(),dtl.getFrudcredat() ,dtl.getFruupdby(),dtl.getFrudupddat(),dtl.getFrudbramt() ,
				(dtl.getFrudchr().equalsIgnoreCase("true")?"Y" : "N"),(dtl.getFrudtb().equalsIgnoreCase("true")?"Y" : "N"),dtl.getFrudbrprc()
				,dtl.getFrudid());
	
		
		return true;
	}

	@Override
	@Transactional
	public boolean delete(RMfruhdrModel model) {
		
		int hdr = model.getFruhid();
		int hdl = model.getrMfrudtlModel().getFruhidKey();
		String sqlHdr = "delete from `rmfruhdr` where `FRUHID`=" + hdr;
		String sqlHdl = "delete from `rmfrudtl` where `FRUDID`=" + hdl;
		jdbcTemplate.update(sqlHdl);
		jdbcTemplate.update(sqlHdr);
		logger.info("HDR " + sqlHdr);
		logger.info("HDL " + sqlHdl);
		
		return true;
	}
	
	public class JoinHDLHDR implements RowMapper<RMfruhdrModel>{

		@Override
		public RMfruhdrModel mapRow(ResultSet rs, int rowNum)throws SQLException {
			RMfruhdrModel hdr = new RMfruhdrModel();
			RMfrudtlModel hdl = new RMfrudtlModel();
			hdr.setrMfrudtlModel(hdl);
//			"(`FRUHID`,`RLRMID`,`FRUHSDAT`,`FRUHEDAT`,`FRUHSTIME`,`FRUHEDTIME`,`FRUHCREBY`,`FRUHCREDAT`,`FRUHUPDBY`,`FRUHUPDDAT`)
			hdr.setFruhid( rs.getInt("FRUHID"));
//			hdr.setRlrmid(rs.getInt("RLRMID"));
			hdr.setFruhsdat(DateUtils.getDateStringFormate(rs.getDate("FRUHSDAT")));
			hdr.setFruhedat(DateUtils.getDateStringFormate(rs.getDate("FRUHEDAT")));
			hdr.setFruhstime(rs.getString("FRUHSTIME"));
			hdr.setFruhedtime(rs.getString("FRUHEDTIME"));
			hdr.setFruhcreby(rs.getString("FRUHCREBY"));
			hdr.setFruhcredat(DateUtils.getDateStringFormate(rs.getDate("FRUHCREDAT")));
			hdr.setFruhupdby( rs.getString("FRUHUPDBY"));
			hdr.setFruhupddat(DateUtils.getDateStringFormate(rs.getDate("FRUHUPDDAT")));
//			"`FRUDID`," +
//			"`FRUHID`,`FRUDREQBY`,`FRUDREQDAT`,`FRUDPRU`,`FRUDRMTYP`,
//			`FRUDDTL`,`FRUDAPS`,`FRUDAPSPRC`,`FRUDTBAMT`," 
//			"`FRUDTBPRC`,`FRUDCHRAMT`,`FRUDCHRPRC`,`FRUDBR`,`FRUDTOTALCST`,
//			`FRUDPAYSTAT`,`FRUDREMARK`,`FRUDREQBY2`," +
//			"`FRUDREQDAT2`,`FRUDAUTBY`," +
//			"`FRUDAUTDAT`,`FRUDCREBY`,`FRUDCREDAT`,`FRUUPDBY`,`FRUDUPDDAT`,`FRUDBRAMT`," +
//			"`FRUDCHR`,`FRUDTB`,`FRUDBRPRC`" +
			hdl.setFrudid( rs.getInt("FRUDID"));
			
			hdl.setFruhidKey(rs.getInt("FRUHID"));
			hdl.setFrudreqby( rs.getString("FRUDREQBY"));
			hdl.setFrudreqdat(DateUtils.getDateStringFormate(rs.getDate("FRUDREQDAT")));
			hdl.setFrudpru(rs.getString("FRUDPRU"));
			hdl.setFrudrmtyp(rs.getString("FRUDRMTYP"));
			
			hdl.setFruddtl( rs.getString("FRUDDTL"));
			hdl.setFrudaps(rs.getString("FRUDAPS"));
			hdl.setFrudapsprc(rs.getBigDecimal("FRUDAPSPRC"));
			hdl.setFrudtbamt(rs.getBigDecimal("FRUDTBAMT"));
			
			hdl.setFrudtbprc( rs.getBigDecimal("FRUDTBPRC"));
			hdl.setFrudchramt( rs.getBigDecimal("FRUDCHRAMT"));
			hdl.setFrudchrprc( rs.getBigDecimal("FRUDCHRPRC"));
			hdl.setFrudbr( rs.getString("FRUDBR"));
			hdl.setFrudtotalcst(rs.getBigDecimal("FRUDTOTALCST"));
			
			hdl.setFrudpaystat(rs.getString("FRUDPAYSTAT"));
			hdl.setFrudremark(rs.getString("FRUDREMARK"));
			hdl.setFrudreqby2(rs.getString("FRUDREQBY2"));
			
			hdl.setFrudreqdat2(DateUtils.getDateStringFormate(rs.getDate("FRUDREQDAT2")));
			hdl.setFrudautby(rs.getString("FRUDAUTBY"));
			
			hdl.setFrudautdat(DateUtils.getDateStringFormate(rs.getDate("FRUDAUTDAT")));
			hdl.setFrudcreby(rs.getString("FRUDCREBY"));
			hdl.setFrudcredat(DateUtils.getDateStringFormate(rs.getDate("FRUDCREDAT")));
			hdl.setFruupdby(rs.getString("FRUUPDBY"));
			hdl.setFrudupddat(DateUtils.getDateStringFormate(rs.getDate("FRUDUPDDAT")));
			hdl.setFrudbramt( rs.getBigDecimal("FRUDBRAMT"));
			
			hdl.setFrudchr( rs.getString("FRUDCHR"));
			hdl.setFrudtb(rs.getString("FRUDTB"));
			hdl.setFrudbrprc(rs.getBigDecimal("FRUDBRPRC"));
			
			return hdr;
		}
		
	}

	@Override
	public DataTableModel<RMfruhdrModel> getUsersDataTable(RMfruhdrModel model,	int iDisplayStart, int iDisplayLength) {
		DataTableModel<RMfruhdrModel> dataTableModel = new DataTableModel<RMfruhdrModel>();
        String sqlLimit = MessageFormat.format(" limit {0},{1} ", new Object[]{iDisplayStart, iDisplayLength});
      
		String sql = "SELECT a.*,b.* FROM rmfruhdr a, rmfrudtl b WHERE a.FRUHID = b.FRUHID ";
		sql += sqlLimit;
        
        List<RMfruhdrModel> list = jdbcTemplate.query(sql, new JoinHDLHDR());
        
        String sqlConnt="SELECT count(1) from rmfruhdr";
		int count = jdbcTemplate.queryForInt(sqlConnt);

		  	dataTableModel.setItems(list);
	        dataTableModel.setTotal(count);
	        dataTableModel.setIndex(iDisplayStart);
	        dataTableModel.setLength(iDisplayLength);
	     
	        logger.info(sql);
	        logger.info(sqlConnt);
	        
		return dataTableModel;
	}

}
